/**
 * 认证相关API接口
 */

import http from '../request.js'
import { API_ENDPOINTS, API_CONFIG } from '../config.js'

/**
 * 认证相关API模块
 * 包含用户注册、登录、token刷新、登出等功能
 */
class AuthAPI {
  /**
   * 用户注册
   * @param {Object} data 注册数据
   * @param {String} data.phone 手机号
   * @param {String} data.password 密码
   * @param {String} data.nickname 昵称（可选）
   */
  async register(data) {
    try {
      const result = await http.post(API_ENDPOINTS.AUTH.REGISTER, data)
      
      // 注册成功后自动保存token和用户信息
      if (result.token) {
        http.setToken(result.token)
      }
      if (result.refresh_token) {
        http.setRefreshToken(result.refresh_token)
      }
      if (result.user) {
        this.setUserInfo(result.user)
      }
      
      return result
    } catch (error) {
      console.error('注册失败:', error)
      throw error
    }
  }

  /**
   * 短信验证登录
   * @param {Object} data 登录数据
   * @param {String} data.phoneNumber 手机号
   * @param {String} data.code 验证码
   */
  async smsLogin(data) {
    try {
      const result = await http.post(API_ENDPOINTS.AUTH.SMS_LOGIN, data)
      
      // 登录成功后自动保存token和用户信息
      if (result.token) {
        http.setToken(result.token)
      }
      if (result.refresh_token) {
        http.setRefreshToken(result.refresh_token)
      }
      if (result.user) {
        this.setUserInfo(result.user)
      }
      
      return result
    } catch (error) {
      console.error('短信登录失败:', error)
      throw error
    }
  }

  /**
   * 用户登录
   * @param {Object} data 登录数据
   * @param {String} data.account 账号（可以是手机号、用户名或邮箱）
   * @param {String} data.password 密码
   */
  async login(data) {
    try {
      const result = await http.post(API_ENDPOINTS.AUTH.LOGIN, data)
      
      // 登录成功后保存token和用户信息
      if (result.token) {
        http.setToken(result.token)
      }
      if (result.refresh_token) {
        http.setRefreshToken(result.refresh_token)
      }
      if (result.user) {
        this.setUserInfo(result.user)
      }
      
      return result
    } catch (error) {
      console.error('登录失败:', error)
      throw error
    }
  }

  /**
   * 刷新访问令牌
   * @param {String} refreshToken 刷新令牌
   */
  async refreshToken(refreshToken) {
    try {
      const result = await http.post(API_ENDPOINTS.AUTH.REFRESH, {
        refreshToken: refreshToken || http.getRefreshToken()
      })
      
      // 更新token
      if (result.token) {
        http.setToken(result.token)
      }
      if (result.refresh_token) {
        http.setRefreshToken(result.refresh_token)
      }
      
      return result
    } catch (error) {
      console.error('Token刷新失败:', error)
      throw error
    }
  }

  /**
   * 登出
   */
  async logout() {
    try {
      // 调用后端登出接口
      await http.post(API_ENDPOINTS.AUTH.LOGOUT)
    } catch (error) {
      console.error('登出接口调用失败:', error)
      // 即使接口失败也要清除本地token
    } finally {
      // 清除本地存储的token和用户信息
      http.clearTokens()
    }
  }

  /**
   * 检查用户是否已登录
   */
  isLoggedIn() {
    const token = http.getToken()
    return !!token
  }

  /**
   * 获取当前用户信息
   */
  getCurrentUser() {
    try {
      const userInfo = uni.getStorageSync(API_CONFIG.STORAGE_KEYS.USER_INFO)
      return userInfo || null
    } catch (error) {
      console.error('获取用户信息失败:', error)
      return null
    }
  }

  /**
   * 保存用户信息到本地存储
   * @param {Object} userInfo 用户信息
   */
  setUserInfo(userInfo) {
    try {
      uni.setStorageSync(API_CONFIG.STORAGE_KEYS.USER_INFO, userInfo)
    } catch (error) {
      console.error('保存用户信息失败:', error)
    }
  }

  /**
   * 微信授权登录
   * @param {String} code 微信授权码
   */
  async wechatLogin(code) {
    try {
      const result = await http.post('/auth/wechat/login', { code })
      
      // 登录成功后保存token和用户信息
      if (result.token) {
        http.setToken(result.token)
      }
      if (result.refresh_token) {
        http.setRefreshToken(result.refresh_token)
      }
      if (result.user) {
        this.setUserInfo(result.user)
      }
      
      return result
    } catch (error) {
      console.error('微信登录失败:', error)
      throw error
    }
  }

  /**
   * 获取用户角色权限信息
   */
  async getUserRoles() {
    try {
      const result = await http.get('/auth/roles')
      return result
    } catch (error) {
      console.error('获取角色信息失败:', error)
      throw error
    }
  }

  /**
   * 检查用户是否有特定权限
   * @param {String} permission 权限标识
   */
  hasPermission(permission) {
    const userInfo = this.getCurrentUser()
    if (!userInfo || !userInfo.role) {
      return false
    }

    // 管理员用户拥有所有权限
    if (userInfo.role === 'SUPER_ADMIN') {
      return true
    }

    // 根据角色检查权限
    const rolePermissions = {
      'USER': ['device.view', 'order.create', 'order.view'],
      'OPERATION_ADMIN': ['device.manage', 'order.manage', 'user.view'],
      'SERVICE_ADMIN': ['device.manage', 'order.manage'],
      'FINANCE_ADMIN': ['payment.manage', 'order.view']
    }

    const permissions = rolePermissions[userInfo.role] || []
    return permissions.includes(permission)
  }

  /**
   * 检查用户是否为管理员
   */
  isAdmin() {
    const userInfo = this.getCurrentUser()
    if (!userInfo || !userInfo.role) {
      return false
    }

    const adminRoles = ['SUPER_ADMIN', 'OPERATION_ADMIN', 'SERVICE_ADMIN', 'FINANCE_ADMIN']
    return adminRoles.includes(userInfo.role)
  }

  /**
   * 检查用户是否可以管理设备
   */
  canManageDevice() {
    return this.hasPermission('device.manage')
  }

  /**
   * 检查用户是否可以创建设备
   */
  canCreateDevice() {
    const userInfo = this.getCurrentUser()
    // 普通用户可以创建自己的设备，管理员可以创建任何设备
    return !!userInfo
  }
}

// 创建实例并导出
const authAPI = new AuthAPI()
export default authAPI 